package com.gw.websocket.ws;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gw.websocket.pojo.Message;
import com.gw.websocket.util.MessageUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

@ServerEndpoint(value="/websocket",configurator = GetHttpSessionConfig.class)//websocket的服务器端

@Component
public class WebSocketServer {
    //concurrent包的线程安全Map，用来存放每个客户端对应的WebSocketServer对象。
    private static Map<String,WebSocketServer> onelineUsers=new ConcurrentHashMap<>();
    //与某个客户端的连接会话，需要通过它来给客户端发送数据,该对象可以发送消息给指定用户
    private Session session;

    //HttpSession对象
    private HttpSession httpSession;

    /**
     * 连接建立成功后
     * @param session
     * @param config
     * @throws Exception
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig config) throws Exception {
        this.session = session;
        //获取httpsession对象
        httpSession=(HttpSession) config.getUserProperties().get(HttpSession.class.getName());
        //从httpSession对象中获取用户名
        String uname= (String) httpSession.getAttribute("uname");
        //1、将当前对象存储到容器中
        onelineUsers.put(uname,this);

        //2、将当前在线用户的用户名推送给所有的客户端
        //1）、获取消息，获取map集合中的key值，即所有的用户名
        String message= MessageUtils.getMessage(true,null,getNames());
        //2）、调用方法进行系统消息推送
        broadcastAllUsers(message);

    }

    public void broadcastAllUsers(String message){
        //将该消息推送给所有的客户端
        try{
            Set<String> names=onelineUsers.keySet();
            for(String name:names){
                WebSocketServer ws=onelineUsers.get(name);
                //发给指定用户
                ws.session.getBasicRemote().sendText(message);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //获取map集合中的key值
    public Object getNames(){
        return onelineUsers.keySet();
    }

    /**websocket的服务器端

    * 接收张三的消息，转发给李四
    * @param message
    * @param session
    */
    @OnMessage
    public void message(String message,Session session){

        try {
            //将message转换成Message对象
            ObjectMapper mapper=new ObjectMapper();
            Message mess=mapper.readValue(message, Message.class);
            //获取当前登录的用户
            String uname= (String) httpSession.getAttribute("uname");
            //获取接收消息的用户（message：toName,message）
            String toName=mess.getToName();
            //获取消息数据
            String data=mess.getMessage();
            //获取推送给指定用户的消息格式的数据
            String resultMessage=MessageUtils.getMessage(false,uname,data);
            //发送数据
            onelineUsers.get(toName).session.getBasicRemote().sendText(resultMessage);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

